#include "weather.h"

#include <QFont>
#include <QPoint>
#include <QPen>
#include <QBrush>

weather::weather(QWidget *parent): QWidget(parent)
{
    color = QColor (204, 235, 255);
}

void weather::set_color(QColor color)
{
    this->color = color;
}

void weather::set_temp(const QVector<WeatherData> &weatherData)
{
    //确保数据不超过7天
    int daysCount = qMin(weatherData.size(), 7);


    for(int i = 0; i < daysCount; i++) {
        const WeatherData &data = weatherData[i];

        int temp=data.highTemp;
        int temp1=data.lowTemp;
        this->high_temp[i]=temp;
        this->low_temp[i]=temp1;
    }
    this->repaint();
}
void weather::handleWeatherData(const QVector<WeatherData> &weatherData)
{
    set_temp(weatherData);
}

void weather::paintEvent(QPaintEvent *event)
{
    Q_UNUSED(event);

    // 创建 QPainter 对象
    QPainter painter(this);

    // 启用抗锯齿效果，使绘制更加平滑
    painter.setRenderHint(QPainter::Antialiasing);

    // 设置画笔颜色和宽度
    QPen pen;
    pen.setColor(this->color);  // 设置边框颜色为黑色
    pen.setWidth(0);  // 设置边框宽度
    painter.setPen(pen);

    // 设置画刷颜色
    QBrush brush;
    brush.setColor(this->color);  // 设置填充颜色为浅蓝色
    brush.setStyle(Qt::SolidPattern);
    painter.setBrush(brush);

    // 获取控件的矩形区域
    QRect rect = this->rect();

    // 绘制圆角矩形，rect 是控件的区域，设置圆角半径为 15
    painter.drawRoundedRect(rect, 15, 15);

    // 将绘图区域分成两半
    int halfHeight = rect.height() / 2;
    // 上半部分绘制高温
    QRect highTempRect = QRect(rect.left(), rect.top(), rect.width(), halfHeight);
    // 下半部分绘制低温
    QRect lowTempRect = QRect(rect.left(), rect.top() + halfHeight, rect.width(), halfHeight);

    // 高温绘制
    lind_color.setRgb(255, 165, 0);
    drawTemperatureChart(painter, highTempRect, this->high_temp, "高温",lind_color );

    // 低温绘制
    lind_color.setRgb(37,222,251);
    drawTemperatureChart(painter, lowTempRect, this->low_temp, "低温", lind_color);
//    Q_UNUSED(event);

//    // 创建 QPainter 对象
//    QPainter painter(this);

//    // 启用抗锯齿效果，使绘制更加平滑
//    painter.setRenderHint(QPainter::Antialiasing);

//    // 设置画笔颜色和宽度
//    QPen pen;
//    pen.setColor(this->color);  // 设置边框颜色为黑色
//    pen.setWidth(0);  // 设置边框宽度
//    painter.setPen(pen);

//    // 设置画刷颜色
//    QBrush brush;
//    brush.setColor(this->color);  // 设置填充颜色为浅蓝色
//    brush.setStyle(Qt::SolidPattern);
//    painter.setBrush(brush);

//    // 获取控件的矩形区域
//    QRect rect = this->rect();

//    // 绘制圆角矩形，rect 是控件的区域，设置圆角半径为 15
//    painter.drawRoundedRect(rect, 15, 15);

//    // 在同一区域绘制高温和低温折线，并在它们之间填充渐变色
//    drawTemperatureChartWithGradient(painter, rect, this->high_temp, this->low_temp);
}
void weather::drawTemperatureChart(QPainter &painter, const QRect &rect, const int temp[], const QString &title, const QColor &color)
{
    // 保存painter状态
    painter.save();

    // 设置绘制区域
    painter.setClipRect(rect);

    // 设置标题
    QPen titlePen(color);
    titlePen.setWidth(3);
    painter.setPen(titlePen);
    painter.drawText(rect.left() + 25, rect.top() + 34, title);

    // 设置折线颜色
    QPen linePen(color);
    linePen.setWidth(3);
    linePen.setStyle(Qt::SolidLine);
    painter.setPen(linePen);

    // 计算温度范围
    int max_temp = temp[0];
    int min_temp = temp[0];
    int unit_temp = 0;
    int unit_time = 0;
    QPoint p_temp[7];

    for(int i = 0; i < 6; i++)
    {
        max_temp = (max_temp > temp[i+1]) ? max_temp : temp[i+1];
        min_temp = (min_temp < temp[i+1]) ? min_temp : temp[i+1];
    }

    // 为温度显示留出一些边距
    int tempRange = max_temp - min_temp;
    if (tempRange == 0) tempRange = 1; // 防止除零

    // 计算单位温度对应的高度，留出上下边距
    unit_temp = rect.height() * 0.3 / tempRange;

    // 计算单位时间对应的宽度，留出左右边距
    unit_time = rect.width() / 8;

    // 计算点的位置
    for(int i = 0; i < 7; i++)
    {
        int x = rect.left() + unit_time + (unit_time * i);
        // Y坐标：从底部开始计算，考虑温度值（温度越高，点位置越高）
        int y = rect.bottom() - 20 - ((temp[i] - min_temp) * unit_temp);
        p_temp[i].setX(x);
        p_temp[i].setY(y);
    }

    // 绘制折线
    painter.drawPolyline(p_temp, 7);

    // 绘制点和温度文本
    for(int i = 0; i < 7; i++)
    {
        // 绘制点
        painter.drawEllipse(p_temp[i].x()-5, p_temp[i].y()-5, 10, 10);

        // 绘制温度文本
        QString tempStr = QString::number(temp[i]) + "℃";
        QRect textRect(p_temp[i].x() - 15, p_temp[i].y() - 25, 30, 20);
        painter.drawText(textRect, Qt::AlignCenter, tempStr);
    }

    // 恢复painter状态
    painter.restore();
}

//void weather::drawTemperatureChartWithGradient(QPainter &painter, const QRect &rect,
//                                                      const QVector<int> &highTemp,
//                                                      const QVector<int> &lowTemp)
//{
//    if (highTemp.isEmpty() || lowTemp.isEmpty() || highTemp.size() != lowTemp.size()) {
//        return;
//    }

//    int margin = 20;
//    int chartWidth = rect.width() - 2 * margin;
//    int chartHeight = rect.height() - 2 * margin;
//    QPoint origin(margin, margin + chartHeight);

//    // 计算温度范围
//    int maxTemp = *std::max_element(highTemp.begin(), highTemp.end());
//    int minTemp = *std::min_element(lowTemp.begin(), lowTemp.end());
//    int tempRange = maxTemp - minTemp;
//    if (tempRange == 0) tempRange = 1; // 避免除零

//    // 创建闭合路径用于渐变填充
//    QPainterPath gradientPath;

//    // 计算所有点的坐标
//    QVector<QPointF> highPoints;
//    QVector<QPointF> lowPoints;

//    for (int i = 0; i < highTemp.size(); ++i) {
//        qreal x = origin.x() + (qreal)i / (highTemp.size() - 1) * chartWidth;

//        // 高温点
//        qreal highY = origin.y() - (qreal)(highTemp[i] - minTemp) / tempRange * chartHeight;
//        highPoints.append(QPointF(x, highY));

//        // 低温点
//        qreal lowY = origin.y() - (qreal)(lowTemp[i] - minTemp) / tempRange * chartHeight;
//        lowPoints.append(QPointF(x, lowY));
//    }

//    // 构建闭合路径：高温从左到右，然后低温从右到左
//    if (!highPoints.isEmpty()) {
//        gradientPath.moveTo(highPoints.first());

//        // 添加高温路径（从左到右）
//        for (int i = 1; i < highPoints.size(); ++i) {
//            gradientPath.lineTo(highPoints[i]);
//        }

//        // 添加低温路径（从右到左）
//        for (int i = lowPoints.size() - 1; i >= 0; --i) {
//            gradientPath.lineTo(lowPoints[i]);
//        }

//        gradientPath.closeSubpath();
//    }

//    // 创建垂直渐变 - 从橙色到冰蓝色
//    QLinearGradient gradient(0, rect.top(), 0, rect.bottom());
//    gradient.setColorAt(0.0, QColor(255, 165, 0));   // 顶部橙色
//    gradient.setColorAt(1.0, QColor(37, 222, 251));  // 底部冰蓝色

//    // 填充渐变区域
//    painter.save();
//    painter.setPen(Qt::NoPen);
//    painter.setBrush(QBrush(gradient));
//    painter.drawPath(gradientPath);
//    painter.restore();

//    // 绘制高温折线（橙色）
//    painter.save();
//    QPen highPen(QColor(255, 165, 0));
//    highPen.setWidth(2);
//    painter.setPen(highPen);

//    QPainterPath highPath;
//    if (!highPoints.isEmpty()) {
//        highPath.moveTo(highPoints.first());
//        for (int i = 1; i < highPoints.size(); ++i) {
//            highPath.lineTo(highPoints[i]);
//        }
//    }
//    painter.drawPath(highPath);
//    painter.restore();

//    // 绘制低温折线（冰蓝色）
//    painter.save();
//    QPen lowPen(QColor(37, 222, 251));
//    lowPen.setWidth(2);
//    painter.setPen(lowPen);

//    QPainterPath lowPath;
//    if (!lowPoints.isEmpty()) {
//        lowPath.moveTo(lowPoints.first());
//        for (int i = 1; i < lowPoints.size(); ++i) {
//            lowPath.lineTo(lowPoints[i]);
//        }
//    }
//    painter.drawPath(lowPath);
//    painter.restore();

//    // 可选：添加标题
//    painter.save();
//    painter.setPen(Qt::white);
//    QFont font = painter.font();
//    font.setPointSize(10);
//    painter.setFont(font);
//    painter.drawText(rect, Qt::AlignTop | Qt::AlignHCenter, "温度趋势");
//    painter.restore();
//}


